package com.cube.dp.adapter;


import com.cube.dp.adapter.fs.third.IThirdPartyFileOperationService;
import com.cube.dp.adapter.fs.third.dto.FileDownloadDto;
import com.cube.dp.adapter.fs.third.dto.FileDownloadForStreamDto;
import com.cube.dp.adapter.fs.third.dto.FileUploadDto;
import com.cube.dp.adapter.fs.third.dto.FileUploadForStreamDto;

/**
 * @author litb
 * @date 2022/5/21 15:28
 * <p>
 * 文件操作适配器
 * 将自研文件服务与第三方文件服务适配
 */
public interface FileOperationAdaptee extends IThirdPartyFileOperationService {

    /**
     * 转换
     *
     * @param dto 参数
     * @return 结果
     */
    default com.cube.dp.adapter.fs.custom.dto.FileUploadDto to(FileUploadDto dto) {
        if (dto == null) {
            return null;
        }
        com.cube.dp.adapter.fs.custom.dto.FileUploadDto fileUploadDto = new com.cube.dp.adapter.fs.custom.dto.FileUploadDto();

        fileUploadDto.setFileName(dto.getFileName());
        fileUploadDto.setFileContent(dto.getFileContent());
        fileUploadDto.setContentType(dto.getContentType());
        fileUploadDto.setMetadata(dto.getMetadata());

        return fileUploadDto;
    }

    /**
     * 转换
     *
     * @param dto 参数
     * @return 结果
     */
    default com.cube.dp.adapter.fs.custom.dto.FileUploadForStreamDto to(FileUploadForStreamDto dto) {
        if (dto == null) {
            return null;
        }
        com.cube.dp.adapter.fs.custom.dto.FileUploadForStreamDto fileUploadDto = new com.cube.dp.adapter.fs.custom.dto.FileUploadForStreamDto();

        fileUploadDto.setFileName(dto.getFileName());
        //输入流一般是不能重复读取的,实际上应该采用byte数组拷贝或者转换成可重复读去的输入流,本案例只是为了演示适配器模式的用法,不严格考虑具体的实现细节了
        fileUploadDto.setFileContent(dto.getFileContent());
        fileUploadDto.setContentType(dto.getContentType());
        fileUploadDto.setMetadata(dto.getMetadata());

        return fileUploadDto;
    }


    /**
     * 转换
     *
     * @param dto 参数
     * @return 结果
     */
    default com.cube.dp.adapter.fs.custom.dto.FileDownloadDto to(FileDownloadDto dto) {
        if (dto == null) {
            return null;
        }
        com.cube.dp.adapter.fs.custom.dto.FileDownloadDto fileUploadDto = new com.cube.dp.adapter.fs.custom.dto.FileDownloadDto();

        fileUploadDto.setFileName(dto.getFileName());
        fileUploadDto.setFileContent(dto.getFileContent());
        fileUploadDto.setContentType(dto.getContentType());
        fileUploadDto.setMetadata(dto.getMetadata());

        return fileUploadDto;
    }

    /**
     * 转换
     *
     * @param dto 参数
     * @return 结果
     */
    default FileDownloadDto to(com.cube.dp.adapter.fs.custom.dto.FileDownloadDto dto) {
        if (dto == null) {
            return null;
        }
        FileDownloadDto fileUploadDto = new FileDownloadDto();

        fileUploadDto.setFileName(dto.getFileName());
        fileUploadDto.setFileContent(dto.getFileContent());
        fileUploadDto.setContentType(dto.getContentType());
        fileUploadDto.setMetadata(dto.getMetadata());

        return fileUploadDto;
    }

    /**
     * 转换
     *
     * @param dto 参数
     * @return 结果
     */
    default com.cube.dp.adapter.fs.custom.dto.FileDownloadForStreamDto to(FileDownloadForStreamDto dto) {
        if (dto == null) {
            return null;
        }
        com.cube.dp.adapter.fs.custom.dto.FileDownloadForStreamDto fileUploadDto = new com.cube.dp.adapter.fs.custom.dto.FileDownloadForStreamDto();

        fileUploadDto.setFileName(dto.getFileName());
        //输入流一般是不能重复读取的,实际上应该采用byte数组拷贝或者转换成可重复读去的输入流,本案例只是为了演示适配器模式的用法,不严格考虑具体的实现细节了
        fileUploadDto.setFileContent(dto.getFileContent());
        fileUploadDto.setContentType(dto.getContentType());
        fileUploadDto.setMetadata(dto.getMetadata());

        return fileUploadDto;
    }

    /**
     * 转换
     *
     * @param dto 参数
     * @return 结果
     */
    default FileDownloadForStreamDto to(com.cube.dp.adapter.fs.custom.dto.FileDownloadForStreamDto dto) {
        if (dto == null) {
            return null;
        }
        FileDownloadForStreamDto fileUploadDto = new FileDownloadForStreamDto();

        fileUploadDto.setFileName(dto.getFileName());
        //输入流一般是不能重复读取的,实际上应该采用byte数组拷贝或者转换成可重复读去的输入流,本案例只是为了演示适配器模式的用法,不严格考虑具体的实现细节了
        fileUploadDto.setFileContent(dto.getFileContent());
        fileUploadDto.setContentType(dto.getContentType());
        fileUploadDto.setMetadata(dto.getMetadata());

        return fileUploadDto;
    }

}
